import os
import re
import google.generativeai as genai
from openpyxl import load_workbook
from openpyxl.styles import Font, Border, Side, Alignment
# -------------------------- 新增：导入第一个代码的核心函数 --------------------------
import holiday_parser  # 导入holiday_parser.py模块

# 配置
GEMINI_API_KEY = "AIzaSyB1NSbgnVQCUNR75QTzjGT4aq9rBKfonI8"  # 替换为有效密钥
GEMINI_MODEL = "gemini-2.5-flash"

# -------------------------- 修改：替换原get_last_week_workdays函数 --------------------------
def get_current_cycle_workdays():
    """
    调用holiday_parser获取目标工作周期（09月28日-10月11日）
    返回格式：[["09月28日", ...], 起始date对象, 结束date对象]
    """
    # 1. 清空holiday_parser的缓存（避免旧数据干扰）
    holiday_parser.holiday_cache.clear()
    
    # 2. 获取前后15天的日期状态（与第一个代码逻辑一致）
    nearby_days = holiday_parser.get_nearby_days_status(days_range=15)
    
    # 3. 筛选当前工作周期的工作日（调用第一个代码的核心函数）
    current_workdays = holiday_parser.get_current_workdays(nearby_days)
    
    if not current_workdays:
        raise ValueError("未从holiday_parser获取到有效工作日数据")
    
    # 4. 转换为原代码需要的格式：
    # - workdays_str: ["09月28日", "09月29日", ...]
    # - workdays_date: [datetime.date对象列表]（用于返回start和end）
    workdays_date = []
    workdays_str = []
    for day in current_workdays:
        # 从第一个代码返回的"date_obj"（datetime对象）中提取date对象
        date_obj = day["date_obj"].date()  # 转为date类型（原代码依赖此类型）
        workdays_date.append(date_obj)
        # 生成"09月28日"格式的字符串
        workdays_str.append(f"{date_obj.month}月{date_obj.day}日")
    
    # 5. 返回：[字符串列表, 起始date对象, 结束date对象]（与原函数返回格式完全一致）
    return workdays_str, workdays_date[0], workdays_date[-1]

# -------------------------- 原函数名替换：调用新的get_current_cycle_workdays --------------------------
def generate_work_data_with_gemini(work_content, workdays_count):
    genai.configure(api_key=GEMINI_API_KEY)
    model = genai.GenerativeModel(GEMINI_MODEL)
    prompt = f"""
    根据以下用户输入的工作内容总结："{work_content}"。
    请生成指定周期 {workdays_count} 天的详细工作日志和下周 5 条工作计划。
    
    请严格按照 JSON 格式输出，不要包含任何额外文字或解释：
    {{
      "last_week_log": {{
        "核心任务": ["任务1", ...], "具体工作内容": ["内容1", ...], 
        "完成进度": ["20%", ...], "待解决问题": ["问题1", ...]
      }},
      "next_week_plan": {{ "核心任务": ["服务器优化", "前端设计优化", "服务功能优化", "组件设计优化", "项目迁移"] }}
    }}
    
    要求：
    1. "last_week_log" 中所有列表的长度必须严格等于 {workdays_count}。
    2. "next_week_plan" 中 "核心任务" 列表长度必须严格等于 5。
    """
    response = model.generate_content(
        contents=prompt,
        generation_config=genai.GenerationConfig(response_mime_type="application/json"),
        safety_settings={
            genai.types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: genai.types.HarmBlockThreshold.BLOCK_NONE,
            genai.types.HarmCategory.HARM_CATEGORY_HATE_SPEECH: genai.types.HarmBlockThreshold.BLOCK_NONE,
            genai.types.HarmCategory.HARM_CATEGORY_HARASSMENT: genai.types.HarmBlockThreshold.BLOCK_NONE,
            genai.types.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: genai.types.HarmBlockThreshold.BLOCK_NONE,
        }
    )
    return eval(response.text)  # 解析 JSON 响应

def copy_template_and_fill_data(template_path, save_dir, employee_id):
    if not os.path.exists(template_path):
        raise FileNotFoundError(f"模板文件不存在：{template_path}")

    # -------------------------- 关键修改：调用新函数获取工作日数据 --------------------------
    last_workdays, week_start, week_end = get_current_cycle_workdays()  # 替换原get_last_week_workdays
    workdays_count = min(len(last_workdays), 7)  # 最多7天（此处目标是6天，不影响）
    if workdays_count == 0:
        print("没有获取到有效工作日，跳过生成。")
        return

    # -------------------------- 文件名日期格式适配：09.28-10.11（与原代码风格一致） --------------------------
    date_range = f"{week_start.month}.{week_start.day}-{week_end.month}.{week_end.day}"
    # 获取 A2 单元格原始数据并替换 \d+ 为 USER_ID
    wb = load_workbook(template_path)
    ws = wb["工作日志"]
    a2_value = ws["A2"].value if ws["A2"].value else ""
    updated_a2_value = re.sub(r'\d+', employee_id, a2_value)
    ws["A2"].value = updated_a2_value

    # -------------------------- 文件名包含目标区间：018,09.28-10.11工作日志.xlsx --------------------------
    new_file_path = os.path.join(save_dir, f"{employee_id},{date_range}工作日志.xlsx")
    
    print("请输入本周期间做的事情（1-2句话，用于生成日志内容）：")
    work_content = input("> ")
    generated_data = generate_work_data_with_gemini(work_content, workdays_count)
    log_data, plan_data = generated_data["last_week_log"], generated_data["next_week_plan"]

    # 样式
    font = Font(name='宋体', size=12)
    border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
    center = Alignment(horizontal='center', vertical='center', wrap_text=True)
    left = Alignment(horizontal='left', vertical='center', wrap_text=True)

    # 清除并写入本周期日志 (第4-13行)
    for i in range(4, 14):
        for c in range(1, 6):
            cell = ws.cell(row=i, column=c)
            cell.value = None
    for i in range(workdays_count):
        row = 4 + i
        ws.row_dimensions[row].height = 30
        # 填充目标工作日数据（09月28日、09月29日等）
        data = [last_workdays[i], log_data["核心任务"][i], log_data["具体工作内容"][i],
                log_data["完成进度"][i], log_data["待解决问题"][i]]
        for c, value in enumerate(data, 1):
            cell = ws.cell(row=row, column=c)
            cell.value = value
            cell.font = font
            cell.border = border
            cell.alignment = left if c in [2, 3] else center

    # 写入下周计划内容 (第15-19行)
    for c in range(1, 6):
        ws.cell(row=15, column=c).border = border
    for i in range(5):
        row = 15 + i
        ws.row_dimensions[row].height = 30
        ws.cell(row=row, column=1, value=i + 1).alignment = center
        ws.cell(row=row, column=2, value=plan_data["核心任务"][i]).alignment = left
        ws.merge_cells(f"B{row}:E{row}")
        for c in range(1, 6):
            ws.cell(row=row, column=c).font = font
            ws.cell(row=row, column=c).border = border

    wb.save(new_file_path)
    print(f"\n日志生成成功！文件路径：{new_file_path}")
    # 额外打印获取的工作日区间（与第一个代码输出一致）
    print(f"\n获取的工作周期：{week_start.month}月{week_start.day}日-{week_end.month}月{week_end.day}日")
    print("具体工作日：")
    for day in last_workdays:
        print(day)

if __name__ == "__main__":
    TEMPLATE_PATH = "工作日志模板.xlsx"
    SAVE_DIR = "."
    user_input = input("请输入工号（不输入则默认使用 017）：")
    employee_id = user_input.strip() if user_input.strip() else "017"
    if not os.path.exists(TEMPLATE_PATH):
        print(f"错误：请确保模板文件 '{TEMPLATE_PATH}' 存在于当前目录。")
    else:
        copy_template_and_fill_data(TEMPLATE_PATH, SAVE_DIR, employee_id)